/* @flow */

/**
 * 函数核心思想：
 * 1. 迭代器模式来保证遍历队列时每一步都是可控的
 * 2. 队列完成后执行对应的回调函数
 * @param {*} queue 
 * @param {*} fn 需要执行的守卫队列
 * @param {*} cb 迭代器函数，守卫队列的每一个守卫都去执行迭代器函数
 */
export function runQueue (queue: Array<?NavigationGuard>, fn: Function, cb: Function) {
  const step = index => {
    // 队列里已经没有内容可以执行了，那就代表队列执行完成了
    if (index >= queue.length) {
      cb()
    } else {
      // 如果队列内容存在就执行迭代函数
      if (queue[index]) {
        fn(queue[index], () => {
          step(index + 1)
        })
      } else {
        // 什么也没有那就到下一步了
        step(index + 1)
      }
    }
  }
  // 启动函数
  step(0)
}

/*

  Vue-Router 路由守卫另一种分类方式就是：前置守卫和后置守卫

  前置守卫：
    * 全局的前置后卫：beforeEach beforeResolve
    * 路由独享的守卫：beforeEnter
    * 组件内的守卫：beforeRouterEnter、beforeRouterUpdate、beforeRouteLeave


  后置守卫：
    * afterEach

  这些守卫的注册机制：
    在路由实例注册的:
    * beforeEach、beforeResolve、afterEach

    在路由配置中注册的（路由独享守卫）:
    * beforeEnter

    组件内的路由守卫：
    * beforeRouteLeave、beforeRouteUpdate、beforeRouteEnter



    导航守卫的执行顺序：
    beforeRouteLeave < beforeEach < beforeRouteUpdate < beforeEnter < beforeRouteEnter < beforeResolve < afterEach

 */